/**
 * 数据是否存在
 * 只要不为 null 或者 undefined 都视为存在
 */
export const isset = (v: unknown) => {
  return v !== null && v !== undefined && !Number.isNaN(v);
};

/**
 * 数据是否为空
 * null、undefined、0、""、NaN、[] 都视为空
 */
export const empty = (v: unknown) => {
  return (
    v === null ||
    v === undefined ||
    v === 0 ||
    v === "" ||
    Number.isNaN(v) ||
    (Array.isArray(v) && v.length === 0)
  );
};

/**
 * 用户名验证
 * 用户名的长度通常为 3-16 个字符（具体长度可以根据需求调整）。
 * 用户名可以包含 字母、数字、下划线（_）和连字符（-）。
 * 用户名的 首尾不能是 特殊字符，只能是字母或数字。
 * 允许字母、数字、下划线和连字符的组合，但不能连续出现特殊字符。
 * 首尾不能是连字符或者下划线
 */
export const usernameValidator = (v: string) =>
  /^(?![_-])([a-zA-Z0-9_-]{3,16})(?<![_-])$/.test(v);

/**
 * 密码验证
 * 最小长度和最大长度（例如：8-16个字符）。
 * 必须包含至少一个大写字母。
 * 必须包含至少一个小写字母。
 * 必须包含至少一个数字。
 * 可以包含特殊字符（如 !@#$%^&* 等）。
 * 不允许包含空格。
 */
export const passwordValidator = (v: string) =>
  /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_+[\]{};':"\\|,.<>/?]).{8,16}$/.test(
    v
  );

/**
 * 邮箱验证
 */
export const emailValidator = (v: string) =>
  /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(v);

/**
 * 中国大陆手机验证
 */
export const phoneValidator = (v: string) => /^1[3-9]\d{9}$$/.test(v);

/**
 * 检查文件是否是 xls 文件
 * .xls 和 .xlsx 都可以
 */
export const xlsxValidator = (mimetype: string) =>
  mimetype ===
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ||
  mimetype === "application/vnd.ms-excel";

export const rootValidator = (username: string) => username === "root";
